/*

 * and open the template in the editor.
 */

package hcmus.fit.master.sevensea.bus;

import hcmus.fit.master.sevensea.R;
import hcmus.fit.master.sevensea.core.Constant;
import hcmus.fit.master.sevensea.core.Sprite;
import hcmus.fit.master.sevensea.utils.Size;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.Style;
import android.graphics.Point;
import android.graphics.Rect;

/**
 * 
 * @author hvp
 */
public class Sea implements Sprite {
    private Size viewSize;
    private Resources resources;
    private Point deltaPos;
    private Bitmap source;
    private Paint paint;

    public Sea(Resources resources, Size viewSize) {
        this.resources = resources;
        this.viewSize = viewSize;
        this.deltaPos = new Point(0, 0);
        this.source = BitmapFactory.decodeResource(this.resources,
                R.drawable.water);
        this.paint = new Paint();
    }

    @Override
    public void draw(Canvas canvas) {
        int srcW = this.source.getWidth();
        int srcH = this.source.getHeight();
        int viewW = this.viewSize.getWidth();
        int viewH = this.viewSize.getHeight();
        int srcX = srcW - deltaPos.x;
        int srcY = srcH - deltaPos.y;
        int sizeX = viewW - deltaPos.x;
        int sizeY = viewH - deltaPos.y;
        // Part 1
        Rect s = new Rect(srcX, srcY, srcW, srcH);
        Rect d = new Rect(0, 0, deltaPos.x, deltaPos.y);
        canvas.drawBitmap(this.source, s, d, this.paint);

        // Part 2
        s = new Rect(0, srcY, sizeX, srcH);
        d = new Rect(deltaPos.x, 0, viewW, deltaPos.y);
        canvas.drawBitmap(this.source, s, d, this.paint);

        // Part 3
        s = new Rect(0, 0, sizeX, sizeY);
        d = new Rect(deltaPos.x, deltaPos.y, viewW, viewH);
        canvas.drawBitmap(this.source, s, d, this.paint);

        // Part 4
        s = new Rect(srcX, 0, srcW, sizeY);
        d = new Rect(0, deltaPos.y, deltaPos.x, viewH);
        canvas.drawBitmap(this.source, s, d, this.paint);

        Paint p = new Paint();
        p.setStyle(Paint.Style.STROKE);
        p.setColor(Color.DKGRAY);
        p.setAlpha(100);
        int nbOfCol = 16;
        int nbOfRow = 16;
        for (int i = 1; i < nbOfCol; i++) {
            canvas.drawLine(i * Constant.CellWidthOrg, 0, i
                    * Constant.CellWidthOrg, viewH, p);
        }
        for (int i = 1; i < nbOfRow; i++) {
            canvas.drawLine(0, i * Constant.CellHeightOrg, viewW, i
                    * Constant.CellHeightOrg, p);
        }
    }

    @Override
    public void update() {
        int x = (deltaPos.x + 1) % this.source.getWidth();
        int y = (deltaPos.y + 1) % this.source.getHeight();
        deltaPos.set(x, y);
    }
    // private Size _size;
    // // public static List Resource;
    // public int Busy;
    // // public List<Bitmap> Frames;
    // // public int Index;
    // // public int NumberOfFrame ;
    // public List Items;
    // public GoodShip MainShip;
    // public Sprite[][] Map;
    // public static List LevelInfomation;
    // private int _level;
    // public Control BoardControl;
    // public boolean Game_Over;
    // // public static Player Sound ;
    // public List _backUp;
    // public boolean CanUndo;
    // public boolean LevelComplete;
    // public Sea(Context context) {
    // super(context);
    //
    // _level = level + 1;
    // _size = size;
    // Index = 0;
    // Frames = (List<Bitmap>) Resource.get(0);
    // NumberOfFrame = Frames.length;
    // Items = new ArrayList();
    // Items.removeAllElements();
    // Generate();
    // _backUp = new ArrayList();
    // CanUndo = false;
    // }

    // public static List GetLevelInformation(String levelInfo) {
    // List rs = new ArrayList();
    // rs.removeAllElements();
    // try {
    // String str = "";
    // while (levelInfo.indexOf('\n') >= 0) {
    // str = levelInfo.substring(0, levelInfo.indexOf('\n') - 1);
    // levelInfo = levelInfo.substring(levelInfo.indexOf('\n') + 1);
    //
    // String black = str.substring(0, str.indexOf(' '));
    // str = str.substring(str.indexOf(' ') + 1);
    // String red = str.substring(0, str.indexOf(' '));
    // str = str.substring(str.indexOf(' ') + 1);
    // String blue = str.substring(0, str.indexOf(' '));
    // str = str.substring(str.indexOf(' ') + 1);
    // String ghost = str;
    //
    // int[] tmp = new int[4];
    // tmp[0] = Integer.parseInt(black);
    // tmp[1] = Integer.parseInt(red);
    // tmp[2] = Integer.parseInt(blue);
    // tmp[3] = Integer.parseInt(ghost);
    // rs.add(tmp);
    // }
    // } catch (Exception ex) {
    // // throw ex;
    // int a = 1;
    // }
    // return rs;
    // }

    // public void Generate() {
    // if (_level <= LevelInfomation.size()) {
    // Busy = 0;
    // Items = new ArrayList();
    // Items.removeAllElements();
    // LevelComplete = false;
    // Game_Over = false;
    //
    // Map = new Sprite[Constant.Height][];
    // for (int i = 0; i < Constant.Height; i++) {
    // Map[i] = new Sprite[Constant.Width];
    // }
    //
    // GenerateGoodShip();
    // GenerateIsland(3);
    // GenerateWhirl(4);
    // int[] tmp = (int[]) LevelInfomation.get(_level - 1);
    //
    // GenerateBlackPirate(tmp[0]);
    // GenerateRedPirate(tmp[1]);
    // GenerateBluePirate(tmp[2]);
    // GenerateGhostShip(tmp[3]);
    // Items.remove(MainShip);
    // Items.add(MainShip);
    // }
    // }

    // public static List GetResource(Bitmap resource, int num, int den) {
    // List rs = new ArrayList();
    // rs.removeAllElements();
    // int w = resource.getWidth();
    // int h = resource.getHeight();
    //
    // List<Bitmap> tmp = new Bitmap[1];
    // // tmp[0] = Bitmap.createBitmap(w,h);
    // // Graphics g = tmp[0].getGraphics();
    // // g.drawBitmap(resource, 0, 0, Graphics.TOP | Graphics.LEFT);
    // //
    // // rs.add(tmp);
    // return rs;
    // }

    // public static void LoadResource(String levelInfo) {
    // try
    // {
    // LevelInfomation = GetLevelInformation(levelInfo);
    //
    // //Bitmap img = Bitmap.createBitmap("/grid.jpg");
    // //Resource = GetResource(img, Configuration.Numerator,
    // Configuration.Denominator);
    //
    // Bitmap img = Bitmap.createBitmap("/goodship.png");
    // GoodShip.Resource = Ship.GetResource(img, 16, 4,
    // Configuration.Numerator, Configuration.Denominator);
    // GoodShip.NumOfStatus = 16;
    //
    // img = Bitmap.createBitmap("/goodshipwhirl.png");
    // GoodShip.ShipWhirl = Explosion.GetResource(img, 32, 1,
    // Configuration.Numerator, Configuration.Denominator);
    //
    // img = Bitmap.createBitmap("/cannon.png");
    // Cannon.Resource = Ship.GetResource(img, 1, 1,
    // Configuration.Numerator, Configuration.Denominator);
    //
    // img = Bitmap.createBitmap("/explode.png");
    // Explosion.Resource = Explosion.GetResource(img, 15, 1,
    // Configuration.Numerator, Configuration.Denominator);
    //
    // img = Bitmap.createBitmap("/islands.png");
    // Island.Resource = Island.GetResource(img, 4, 2,
    // Configuration.Numerator, Configuration.Denominator);
    //
    // img = Bitmap.createBitmap("/whirl.png");
    // Whirl.Resource = Whirl.GetResource(img, 1, 16,
    // Configuration.Numerator, Configuration.Denominator);
    //
    // img = Bitmap.createBitmap("/pirate.png");
    // BlackPirate.Resource = Ship.GetResource(img, 16, 4,
    // Configuration.Numerator, Configuration.Denominator);
    // BlackPirate.NumOfStatus = 16;
    //
    // img = Bitmap.createBitmap("/splash.png");
    // Splash.Resource = Splash.GetResource(img, 12, 1,
    // Configuration.Numerator, Configuration.Denominator);
    //
    // img = Bitmap.createBitmap("/rubble.png");
    // Rubble.Resource = Rubble.GetResource(img, 12, 1,
    // Configuration.Numerator, Configuration.Denominator);
    //
    // img = Bitmap.createBitmap("/redpirate.png");
    // RedPirate.Resource = Ship.GetResource(img, 16, 4,
    // Configuration.Numerator, Configuration.Denominator);
    // RedPirate.NumOfStatus = 16;
    //
    // img = Bitmap.createBitmap("/bluepirate.png");
    // BluePirate.Resource = Ship.GetResource(img, 16, 4,
    // Configuration.Numerator, Configuration.Denominator);
    // BluePirate.NumOfStatus = 16;
    //
    // img = Bitmap.createBitmap("/ghostship.png");
    // GhostShip.Resource = Ship.GetResource(img, 16, 4,
    // Configuration.Numerator, Configuration.Denominator);
    // GhostShip.NumOfStatus = 16;
    // /*
    //
    //
    //
    // Cannon.Sound = new SoundPlayer(path + "Sound/boom.wav");
    // Cannon.Sound.Load();
    //
    // Explosion.Sound = new SoundPlayer(path + "Sound/explode.wav");
    // Explosion.Sound.Load();
    //
    //
    // Explosion.Sound = new SoundPlayer(path + "Sound/explode.wav");
    // Explosion.Sound.Load();
    //
    // */
    // }
    // catch(Exception ex)
    // {
    // String s = ex.getMessage();
    // }
    // }
    //
    // public static void UnLoadResource() {
    // LevelInfomation = null;
    //
    // // Bitmap img = Bitmap.createBitmap("/grid.jpg");
    // // Resource = GetResource(img, Configuration.Numerator,
    // // Configuration.Denominator);
    //
    // GoodShip.Resource = null;
    // GoodShip.NumOfStatus = 0;
    //
    // GoodShip.ShipWhirl = null;
    //
    // Cannon.Resource = null;
    //
    // Explosion.Resource = null;
    //
    // Island.Resource = null;
    //
    // Whirl.Resource = null;
    //
    // BlackPirate.Resource = null;
    // BlackPirate.NumOfStatus = 0;
    //
    // Splash.Resource = null;
    //
    // Rubble.Resource = null;
    //
    // RedPirate.Resource = null;
    // RedPirate.NumOfStatus = 0;
    //
    // BluePirate.Resource = null;
    // BluePirate.NumOfStatus = 0;
    //
    // GhostShip.Resource = null;
    // GhostShip.NumOfStatus = 0;
    // }
    //
    // public void GenerateGoodShip() {
    // MainShip = new GoodShip(this, Constant.Width / 2, Constant.Height / 2);
    // Map[Constant.Height / 2][Constant.Width / 2] = MainShip;
    // Items.add(MainShip);
    // }
    //
    // public void GenerateBlackPirate(int num) {
    // Random r = new Random();
    // for (int i = 0; i < num; i++) {
    // boolean run;
    // int x, y;
    // do {
    // run = false;
    // x = r.nextInt(Constant.Width);
    // y = r.nextInt(Constant.Height);
    // if (Map[y][x] != null
    // || ((x >= MainShip.X - 2) && (x <= MainShip.X + 2) && (y >= MainShip.Y -
    // 2) && (y <= MainShip.Y + 2))) {
    // run = true;
    // }
    // } while (run);
    // BlackPirate ship = new BlackPirate(this, x, y);
    // Items.add(ship);
    // Map[y][x] = ship;
    // }
    // }
    //
    // public void GenerateRedPirate(int num) {
    // Random r = new Random();
    // for (int i = 0; i < num; i++) {
    // boolean run;
    // int x, y;
    // do {
    // run = false;
    // x = r.nextInt(Constant.Width);
    // y = r.nextInt(Constant.Height);
    // if (Map[y][x] != null
    // || ((x >= MainShip.X - 2) && (x <= MainShip.X + 2) && (y >= MainShip.Y -
    // 2) && (y <= MainShip.Y + 2))) {
    // run = true;
    // }
    // } while (run);
    // RedPirate ship = new RedPirate(this, x, y);
    // Items.add(ship);
    // Map[y][x] = ship;
    // }
    // }
    //
    // public void GenerateBluePirate(int num) {
    // Random r = new Random();
    // for (int i = 0; i < num; i++) {
    // boolean run;
    //
    // int x, y;
    // do {
    // run = false;
    // x = r.nextInt(Constant.Width);
    // y = r.nextInt(Constant.Height);
    // if (Map[y][x] != null
    // || ((x >= MainShip.X - 2) && (x <= MainShip.X + 2) && (y >= MainShip.Y -
    // 2) && (y <= MainShip.Y + 2))) {
    // run = true;
    // }
    // } while (run);
    // BluePirate ship = new BluePirate(this, x, y);
    // Items.add(ship);
    // Map[y][x] = ship;
    // }
    // }
    //
    // public void GenerateGhostShip(int num) {
    // Random r = new Random();
    // for (int i = 0; i < num; i++) {
    // boolean run;
    // int x, y;
    // do {
    // run = false;
    // x = r.nextInt(Constant.Width - 1);
    // y = r.nextInt(Constant.Height - 1);
    // if (Map[y][x] != null) {
    // run = true;
    // }
    // } while (run);
    // GhostShip ship = new GhostShip(this, x, y);
    // Items.add(ship);
    // Map[y][x] = ship;
    // }
    // }
    //
    // public void GenerateIsland(int num) {
    // Random r = new Random();
    //
    // for (int i = 0; i < num; i++) {
    // boolean run;
    // int x, y;
    // do {
    // run = false;
    // x = r.nextInt(Constant.Width);
    // y = r.nextInt(Constant.Height);
    // if (Map[y][x] != null)
    // run = true;
    // } while (run);
    // Island il = new Island(this, x, y);
    // Items.add(il);
    // Map[y][x] = il;
    // }
    // }
    //
    // public void GenerateWhirl(int num) {
    // Random r = new Random();
    //
    // for (int i = 0; i < num; i++) {
    // boolean run;
    //
    // int x, y;
    // do {
    // run = false;
    // x = r.nextInt(Constant.Width);
    // y = r.nextInt(Constant.Height);
    // if (Map[y][x] != null)
    // run = true;
    // } while (run);
    // Whirl wh = new Whirl(this, x, y);
    // Items.add(wh);
    // Map[y][x] = wh;
    // }
    // }

    // @Override
    // protected void onDraw(Canvas canvas) {
    // super.onDraw(canvas);
    // Bitmap src = BitmapFactory.decodeResource(getResources(),
    // R.drawable.grid);
    // canvas.drawBitmap(src, new Rect(0, 0, src.getWidth(), src.getHeight()),
    // new Rect(
    // 0, 0, src.getWidth(), src.getHeight()), new Paint());
    // }
    //
    // public void Show(Canvas canvas) {
    // try{
    // Bitmap BackGround = Bitmap.createBitmap("/grid.jpg");
    // Bitmap tmp = Bitmap.createBitmap(BackGround.getWidth() +
    // Configuration.PadLeft + Configuration.PadRight,
    // BackGround.getHeight() + Configuration.PadTop +
    // Configuration.PadBottom);
    //
    // Graphics g = tmp.getGraphics();
    // g.setColor(0, 0, 50);
    // g.fillRect(0, 0, BackGround.getWidth() + Configuration.PadLeft +
    // Configuration.PadRight - 1, BackGround.getHeight() +
    // Configuration.PadTop + Configuration.PadBottom - 1);
    //
    // g.drawBitmap(BackGround, Configuration.PadLeft, Configuration.PadTop,
    // Graphics.TOP | Graphics.LEFT);
    // /* g.DrawBitmap(Frames[Index],
    // new Rectangle(Configuration.PadLeft, Configuration.PadTop,
    // Frames[Index].Width,
    // Frames[Index].Height),
    // 0, 0, Frames[Index].Width, Frames[Index].Height,
    // GraphicsUnit.Pixel, imgatt);*/
    //
    // for( int i=0; i< Items.size();i++)
    // {
    // MySprite item = (MySprite)Items.get(i);
    // item.Show(g);
    // }
    //
    //
    // //BoardControl._Life.Show(g, Configuration.TotalLeft +
    // MainShip.Position.X, Configuration.TotalTop + MainShip.Position.Y);
    //
    // g1.drawRegion(tmp,
    // MainShip.Position.X - (_size.Width - Configuration.CellWidth) /2 +
    // Configuration.TotalLeft,
    // MainShip.Position.Y - (_size.Height - Configuration.ControlHeight -
    // Configuration.CellHeight) /2 + Configuration.TotalTop,
    // _size.Width, (_size.Height - Configuration.ControlHeight),
    // Sprite.TRANS_NONE, 0, 0 , Graphics.TOP | Graphics.LEFT);
    //
    //
    // /* g1.DrawBitmap(tmp, new Rectangle(0, 0, _size.Width, _size.Height -
    // Configuration.ControlHeight),
    // MainShip.Position.X - (_size.Width - Configuration.CellWidth) /2 +
    // Configuration.TotalLeft,
    // MainShip.Position.Y - (_size.Height - Configuration.ControlHeight -
    // Configuration.CellHeight) /2 + Configuration.TotalTop,
    // _size.Width, (_size.Height - Configuration.ControlHeight),
    // GraphicsUnit.Pixel, imgatt);
    // */
    // }catch(Exception ex){
    // int a = 1;
    // }
    // }
    //
    // public boolean Win() {
    // for (int i = 0; i < Items.size() - 1; i++) {
    // if (((Sprite) Items.get(i)).IsShip() &&
    // !Items.get(i).equals(MainShip)) {
    // return false;
    // }
    // }
    // return true;
    // }
    //
    // public boolean Close() {
    // if (Items.contains(MainShip))
    // return false;
    // return true;
    // }
    //
    // public void EnemyMove() {
    // for (int i = 0; i < Items.size(); i++) {
    // if (((Sprite) Items.get(i)).IsEnemy()) {
    // Busy++;
    // Ship s = (Ship) Items.get(i);
    // s.GetDirection(MainShip.X, MainShip.Y);
    // s.GetDestination();
    // s.State = ShipState.Rotating;
    // Map[s.Y][s.X] = null;
    //
    // }
    // }
    // Busy--;// busy cua mainship
    // }
    //
    // public void NextLevel() {
    // Busy++;
    // LevelComplete = true;
    // }
    //
    // public void ChangeLevel() {
    // _level++;
    // BoardControl._Level.LEVEL++;
    // Generate();
    // }
    // public void ReloadCurrentLevel() {
    // Generate();
    // }
    //
    // public void CreateExplosion(int x, int y) {
    // Explosion e = new Explosion(this, x, y);
    // // Explosion.Sound.Play();
    // Items.add(e);
    // }
    //
    // public void CreateSplash(int x, int y) {
    // Splash e = new Splash(this, x, y);
    // Items.add(e);
    // }
    //
    // public void CreateRubble(int x, int y) {
    // Rubble r = new Rubble(this, x, y);
    // Items.add(r);
    // Map[y][x] = r;
    // }
    //
    // public void GameOver() {
    // CanUndo = false;
    // Game_Over = true;
    // Busy++;
    // }

    // public void BackUpAll() {
    // _backUp.removeAllElements();
    //
    // for (int i = 0; i < Items.size(); i++) {
    // Sprite item = (Sprite) Items.get(i);
    //
    // if (item.getClass().equals(BlackPirate.class)) {
    // BlackPirate b = new BlackPirate((BlackPirate) item);
    // _backUp.add(b);
    // } else if (item.getClass().equals(RedPirate.class)) {
    // RedPirate r = new RedPirate((RedPirate) item);
    // _backUp.add(r);
    // } else if (item.getClass().equals(BluePirate.class)) {
    // BluePirate b = new BluePirate((BluePirate) item);
    // _backUp.add(b);
    // } else if (item.getClass().equals(GhostShip.class)) {
    // GhostShip g = new GhostShip((GhostShip) item);
    // _backUp.add(g);
    // } else if (item.getClass().equals(GoodShip.class)) {
    // GoodShip g = new GoodShip((GoodShip) item);
    // _backUp.add(g);
    // } else {
    // _backUp.add(item);
    // }
    // }
    // CanUndo = true;
    // }
    //
    // public void SetFromBackUp() {
    // // Stream s = new MemoryStream(Encoding.ASCII.GetBytes(_backUp));
    // // XmlSerializer xs = new XmlSerializer(typeof(List<MyUserControl>));
    //
    // // Items = (List<MyUserControl>)xs.Deserialize(s);
    // if (!CanUndo)
    // return;
    //
    // // Items.Clear();
    //
    // // int i = 0;
    // // while (i<Items.Count)
    // // {
    // // MyUserControl m = Items[i];
    // // if (m.IsShip())
    // // {
    // // Items.RemoveAt(i);
    // // Map[m.Y][m.X] = null;
    // // }
    // // else
    // // i++;
    // // }
    // for (int i = 0; i < Items.size(); i++) {
    // Sprite item = (Sprite) Items.get(i);
    // Map[item.Y][item.X] = null;
    // }
    // Items.removeAllElements();
    //
    // for (int i = 0; i < _backUp.size(); i++) {
    //
    // Sprite control = (Sprite) _backUp.get(i);
    // Items.add(control);
    // Map[control.Y][control.X] = control;
    // if (control.getClass().equals(GoodShip.class)) {
    // MainShip = (GoodShip) control;
    // }
    // }
    //
    // // foreach (Ship ship in _backUp)
    // // {
    // // Items.Add(ship);
    // // Map[ship.Y][ship.X] = ship;
    // // if (ship.GetType().Equals(typeof(GoodShip)))
    // // {
    // // MainShip = (GoodShip)ship;
    // // }
    // // }
    // CanUndo = false;
    // }

}
